/**
 * 
 */
package gwtool.gui.dataSetView;

import gwtool.container.DataSet;
import gwtool.container.DataSetItem;
import gwtool.container.GeraetItem;
import gwtool.container.Gruppe;
import gwtool.container.OnlinePruefungItem;
import gwtool.container.PersonItem;
import gwtool.drucken.DruckController;
import gwtool.gui.MainController;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

/**
 * @author Christian
 * 
 */
public class DataSetViewController implements ActionListener {

	private int versionToDraw = -1;

	private DataSet set = null;

	private DataSetView view;

	public DataSetViewController(DataSet set, int versionToDraw) {

		this(set, versionToDraw, true);
	}

	public DataSetViewController(DataSet set, int versionToDraw, boolean zeigeButtons) {

		this.versionToDraw = versionToDraw;
		if (versionToDraw == -1) {
			this.versionToDraw = set.getAktuellesDataItem().getId();
		}
		this.set = set;
		if (set.getType().equals("Geraet")) {
			view = new DataSetGereatPanel(this, (GeraetItem) set.getDataItemByID(this.versionToDraw), zeigeButtons);
		} else if (set.getType().equals("Pruefung")) {
			view = new DataSetPruefungPanel(this, (OnlinePruefungItem) set.getDataItemByID(this.versionToDraw), zeigeButtons);
		} else if (set.getType().equals("Person")) {
			view = new DataSetPersonPanel(this, (PersonItem) set.getDataItemByID(this.versionToDraw), zeigeButtons);
		} else if (set.getType().equals("Lehrgang")) {
			view = new DataSetLehrgangPanel(this, set.getDataItemByID(this.versionToDraw), zeigeButtons);
		}
	}

	public Component getPanel() {

		return view.getJPanel();
	}

	public String getTabBezeichner() {

		return view.getTabBezeichner();
	}

	public void schliessen() {

		if (view.hasChanges()) {
			int answer = JOptionPane.showConfirmDialog(view.getJPanel(),
					"Sollen die Änderungen vor dem Schließen gespeichert werden?", "Speichern", JOptionPane.YES_NO_OPTION,
					JOptionPane.INFORMATION_MESSAGE);
			if (answer == JOptionPane.YES_OPTION) {
				speichern();
			}
		}
		MainController.getInstance().closeTab(set);
	}

	public boolean hasChanges() {

		return view.hasChanges();
	}

	public boolean isAendernErlaubt() {

		for (Gruppe gruppe : MainController.getInstance().getDataController().getBenutzter().getGruppeMitSchreibRechenten()) {
			if (set.getGruppe() == gruppe.getId()) {
				return true;
			}
		}
		return false;
	}

	public void speichern() {

		set.addNewDataSetItem(view.getDataFromGui());
		MainController.getInstance().updateGui();
	}

	public DataSetView getView() {

		return view;
	}

	private void copyDataSet() {

		if (view.hasChanges()) {
			int ans = JOptionPane.showConfirmDialog(view.getJPanel(), "Soll vor dem Kopieren gespeichert werden?");
			if (ans == JOptionPane.YES_OPTION) {
				speichern();
			}
		}
		DataSet newSet = new DataSet(-1, -1, this.set.getGruppe());
		DataSetItem item = view.getDataFromGui();
		String s = (String) JOptionPane.showInputDialog(view.getJPanel(), "Bezeichner des neuen Eintrages",
				"Customized Dialog", JOptionPane.PLAIN_MESSAGE, null, null, item.getBezeichner());
		if (s == null) {
			return;
		}
		item.setBezeichner(s);
		newSet.addNewDataSetItem(item);
		MainController.getInstance().getDataController().getDataSetList().add(newSet);
		MainController.getInstance().updateGui();
		MainController.getInstance().showDataSetTab(newSet);
	}

	@Override
	public void actionPerformed(ActionEvent e) {

		if (e.getSource() == view.getBtnSpeichern()) {
			speichern();
			view.wurdeGespeichert();
		}
		if (e.getSource() == view.getBtnSchlieen()) {
			schliessen();
		}
		if (e.getSource() == view.getBtnKopieErstellen()) {
			copyDataSet();
		}
		if (e.getSource() == view.getBtnDrucken()) {
			drucken();
		}
	}

	private void drucken() {

		if (view.hasChanges()) {
			int answer = JOptionPane.showConfirmDialog(view.getJPanel(),
					"Sollen die Änderungen vor dem Drucken gespeichert werden?", "Speichern", JOptionPane.YES_NO_OPTION,
					JOptionPane.INFORMATION_MESSAGE);
			if (answer == JOptionPane.YES_OPTION) {
				speichern();
			}
		}
		List<DataSetItem> list = new ArrayList<>();
		list.add(view.getDataFromGui());
		new DruckController().druckeItem(list);
	}
}
